#ifndef _libasm_
#define _libasm_

#include "defs.h"

/* Interrupciones y excepciones. */

void	_int_08_hand(void);     		/* Timer tick. */
void	_int_09_hand(void);     		/* Teclado. */

void	_div0_hand(void);				/* Error de ivision por 0. */
void	_bounds_hand(void);				/* Bounds exeeded. */
void	_opcode_hand(void);				/* Codigo de operacion invalido. */
void	_snotpresent_hand(void);		/* Segmento no presente. */
void	_ssegfault_hand(void);			/* Segment fault. */
void	_gpfault_hand(void);			/* Fallo de proteccion general. */
void	_pagefault_hand(void);			/* Error de pagina (Page Fault). */

/* Sistema. */

void    _lidt (IDTR *idtr);

void	_cliWrp(void);					/* Deshabilita interrupciones.  */
void	_stiWrp(void);	 				/* Habilita interrupciones.  */

void	_write_esp(int);				/* Carga un valor en el registro ESP. */

void	_write_cr0 (unsigned long);		/* Escribe el registro cr0. */			
void	_write_cr3 (unsigned long*);	/* Escribe el registro cr3. */

unsigned long _read_cr0 (void);			/* Lee el registro cr0. */
unsigned long* _read_cr3 (void);		/* Lee el registro cr3. */	

void	_mascaraPIC1 (byte mascara);  	/* Escribe mascara de PIC1. */
void	_mascaraPIC2 (byte mascara);  	/* Escribe mascara de PIC2. */

/* Funcion que arma los stack frames de cada proceso. */

int _loadStack( int (*process) (void), int stackstart, void(*cleaner)(void));

/* Funcion que cambia una tarea sin tener que esperar al timer tick. */

void _scheduler (void);

/* Varias. */

void 	_beep (void);
void	_screen (void);

#endif
